//
//  YSNetworking.h
//  YSKitExample
//
//  Created by Kyson on 2017/6/16.
//  Copyright © 2017年 YangShen. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
// 项目打包上线都不会打印日志，因此可放心。
#ifdef DEBUG
#define YSNetLog(s, ... ) NSLog(@"[%@ in line %d] ===============>%@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
#else
#define YSNetLog(s, ... )
#endif

typedef NS_ENUM(NSInteger, YSNetworkStatus) {
    YSNetworkStatusUnknown          = -1, ///< 未知网络
    YSNetworkStatusNotReachable     = 0,  ///< 网络无连接
    YSNetworkStatusReachableViaWWAN = 1,  ///< 2、3、4G
    YSNetworkStatusReachableViaWiFi = 2   ///< WIFI
};

typedef NS_ENUM(NSUInteger, YSRequestType) {
    YSRequestTypeJSON      = 1, ///< 默认
    YSRequestTypePlainTest = 2  ///< text/html
};

typedef NS_ENUM(NSUInteger, YSResponseType) {
    YSResponseTypeJSON = 1, ///< 默认-JSON
    YSResponseTypeXML  = 2, ///< XML
    YSResponseTypeData = 3  ///< Data-需自己转换
};

/**
 *  下载进度Block
 *
 *  @param bytesRead      已下载的大小
 *  @param totalBytesRead 文件总大小
 */
typedef void (^YSDownloadProgress)(int64_t bytesRead, int64_t totalBytesRead);
typedef YSDownloadProgress YSGetProgress;
typedef YSDownloadProgress YSPostProgress;

/**
 *  上传进度Block
 *
 *  @param bytesWritten      已上传的大小
 *  @param totalBytesWritten 总上传的大小
 */
typedef void (^YSUploadProgress)(int64_t bytesWritten, int64_t totalBytesWritten);

/**
 *  成功回调Block
 *
 *  @param response 成功的数据
 */
typedef void(^YSResponseSuccess)(id response);

/**
 *  失败回调Block
 *
 *  @param error 失败原因
 */
typedef void(^YSResponseFail)(NSError *error);

typedef NSURLSessionTask YSURLSessionTask;

/**
 *  基于AFNetworking 3.x封装
 */
@interface YSNetworking : NSObject

#pragma mark - Config: 建议在AppDelegate里面设置
/**
 *  指定网络接口的基础url,即前面不动的部分，建议在AppDelegate里面设置
 *  如需使用不同的基础url,可以调用该方法更新，改变基础url
 *
 *  @param baseUrl 网络接口的基础url
 */
+ (void)updateBaseUrl:(NSString *)baseUrl;
+ (NSString *)baseUrl;

/**
 *  设置请求超时时间，默认为60s，建议在AppDelegate里面设置
 *
 *  @param timeout 超时时间
 */
+ (void)setTimeout:(NSTimeInterval)timeout;

/**
 *  是否显示打印信息
 *
 *  @param isDebug 开发期建议打开，默认NO。
 */
+ (void)enableInterfaceDebug:(BOOL)isDebug;

/**
 *  配置请求格式，默认为JSON。如果要求传XML或者PLIST，请在全局配置一下
 *
 *  @param requestType                   请求格式，默认为JSON
 *  @param responseType                  响应格式，默认为JSON
 *  @param shouldCallbackOnCancelRequest 当取消请求时，是否要回调，默认为YES
 */
+ (void)configRequestType:(YSRequestType)requestType
             responseType:(YSResponseType)responseType
  callbackOnCancelRequest:(BOOL)shouldCallbackOnCancelRequest;

/**
 *  配置公共的请求头，只调用一次即可，通常放在应用启动的时候配置就可以了
 *
 *  @param httpHeaders 只需要将与服务器商定的固定参数设置即可
 */
+ (void)configCommonHttpHeaders:(NSDictionary *)httpHeaders;

#pragma mark - Methods

/**
 *  取消所有的请求
 */
+ (void)cancelAllRequest;

/**
 *	取消某个请求。如果是要取消某个请求，最好是引用接口所返回来的YSURLSessionTask对象，
 *  然后调用对象的cancel方法。如果不想引用对象，这里额外提供了一种方法来实现取消某个请求
 *
 *  @param url URL，可以是绝对URL，也可以是path（也就是不包括baseurl）
 */
+ (void)cancelRequestWithURL:(NSString *)url;

/**
 *  网络请求
 */
+ (YSURLSessionTask *)GET:(NSString *)url
                   params:(NSDictionary *)params
                  success:(YSResponseSuccess)success
                  failure:(YSResponseFail)failure;
+ (YSURLSessionTask *)GET:(NSString *)url
                   params:(NSDictionary *)params
                 progress:(YSDownloadProgress)progress
                  success:(YSResponseSuccess)success
                  failure:(YSResponseFail)failure;

+ (YSURLSessionTask *)POST:(NSString *)url
                    params:(NSDictionary *)params
                   success:(YSResponseSuccess)success
                   failure:(YSResponseFail)failure;
+ (YSURLSessionTask *)POST:(NSString *)url
                    params:(NSDictionary *)params
                  progress:(YSDownloadProgress)progress
                   success:(YSResponseSuccess)success
                   failure:(YSResponseFail)failure;

+ (YSURLSessionTask *)Upload:(NSString *)url
               uploadingFile:(NSString *)uploadingFile
                    progress:(YSUploadProgress)progress
                     success:(YSResponseSuccess)success
                     failure:(YSResponseFail)failure;
+ (YSURLSessionTask *)UploadImage:(UIImage *)image
                              url:(NSString *)url
                         filename:(NSString *)filename
                             name:(NSString *)name
                         mimeType:(NSString *)mimeType
                       parameters:(NSDictionary *)parameters
                         progress:(YSUploadProgress)progress
                          success:(YSResponseSuccess)success
                          failure:(YSResponseFail)failure;

+ (YSURLSessionTask *)DownLoad:(NSString *)url
                    saveToPath:(NSString *)saveToPath
                      progress:(YSDownloadProgress)progressBlock
                       success:(YSResponseSuccess)success
                       failure:(YSResponseFail)failure;

+ (YSNetworkStatus)getNetworkStates;

@end
